package it.polimi.traveldream.ejb.bean;



import it.polimi.authentication.ejb.usermanagement.Escursione;
import it.polimi.authentication.ejb.usermanagement.GiftList;
import it.polimi.authentication.ejb.usermanagement.Hotel;
import it.polimi.authentication.ejb.usermanagement.ListaPacchettiComprati;
import it.polimi.authentication.ejb.usermanagement.MezzoDiTrasporto;
import it.polimi.authentication.ejb.usermanagement.Pacchetto;
import it.polimi.authentication.ejb.usermanagement.Citta;
import it.polimi.authentication.ejb.usermanagement.PacchettoCitta;
import it.polimi.authentication.ejb.usermanagement.PacchettoEscursione;
import it.polimi.authentication.ejb.usermanagement.PacchettoHotel;
import it.polimi.authentication.ejb.usermanagement.PacchettoMezzo;
import it.polimi.authentication.ejb.usermanagement.PacchettoPredefinito;
import it.polimi.authentication.ejb.usermanagement.dto.CittaDTO;
import it.polimi.authentication.ejb.usermanagement.dto.EscursioneDTO;
import it.polimi.authentication.ejb.usermanagement.dto.HotelDTO;
import it.polimi.authentication.ejb.usermanagement.dto.MezzoDTO;
import it.polimi.authentication.ejb.usermanagement.dto.PacchettoEscursioneDTO;
import it.polimi.authentication.ejb.usermanagement.dto.PacchettoHotelDTO;
import it.polimi.authentication.ejb.usermanagement.dto.PacchettoMezzoDTO;
import it.polimi.authentication.ejb.usermanagement.dto.PacchettoPredefinitoDTO;
import it.polimi.authentication.ejb.usermanagement.dto.Pacchetto_cittaDTO;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.Temporal;

/**
 * Session Bean implementation class UserBean
 */
@Stateless
public class AddPacchettoPredefinito implements PacchettoPredefinito{


	@PersistenceContext
    private EntityManager em;
	
	public AddPacchettoPredefinito(){
		
	}
	
	@Override
	public int add(PacchettoPredefinitoDTO pacchettoDTO, Pacchetto_cittaDTO pacchettoCittaDTO, PacchettoHotelDTO PacchettoHotelDTO, PacchettoMezzoDTO pacchettoMezzoADTO, PacchettoMezzoDTO pacchettoMezzoRDTO, ArrayList <PacchettoEscursioneDTO> PacchettoEscursioneDTO)
	{
		//crea nuovo pacchetto
		Pacchetto newP = new Pacchetto (pacchettoDTO);
		//inserisci 
		newP.setDisponibile(true);
		
		//si fa la somma e la si inserisce in newP.setPrezzo()
		
		//newP.setPrezzo(sommaPrezzi(PacchettoHotelDTO.getNomeHotel(), pacchettoMezzoADTO.getMezzoDiTrasporto(), pacchettoMezzoRDTO.getMezzoDiTrasporto(), PacchettoEscursioneDTO.getNomeEscursione(), newP.getData_Partenza(), newP.getData_Ritorno()));
		BigDecimal appDecimal;
		ArrayList<EscursioneDTO> listaPacchettoEscursione = new ArrayList<EscursioneDTO>();
		for (int i=0; i<PacchettoEscursioneDTO.size(); i++){
			EscursioneDTO app = new EscursioneDTO();
			app.setNome(PacchettoEscursioneDTO.get(i).getNomeEscursione());
			app.setPrezzo((BigDecimal)em.createNamedQuery("Escursione.findPrezzo").setParameter("nomeEsc", app.getNome()).getSingleResult());
			listaPacchettoEscursione.add(app);
		}
		
		
		appDecimal = sommaPrezzi(PacchettoHotelDTO.getNomeHotel() , pacchettoMezzoADTO.getMezzoDiTrasporto(), pacchettoMezzoRDTO.getMezzoDiTrasporto(), listaPacchettoEscursione, newP.getData_Partenza(), newP.getData_Ritorno());
//		for (int i=1; i<PacchettoEscursioneDTO.size();i++)
//		{
//			Query qE= em.createNamedQuery("Escursione.findPrezzo").setParameter("nomeEsc", PacchettoEscursioneDTO.get(i).getNomeEscursione());
//			BigDecimal prezzoEscursione =(BigDecimal) qE.getSingleResult();
//			appDecimal = appDecimal.add(prezzoEscursione);
//		}
		newP.setPrezzo(appDecimal);
		em.persist(newP);
	    System.out.println(newP.getId());
		
		pacchettoCittaDTO.setIDPacchetto(newP.getId());
		PacchettoCitta newPC = new PacchettoCitta(pacchettoCittaDTO);
		em.persist(newPC);
		
		PacchettoHotelDTO.setIDPacchetto(newP.getId());
		PacchettoHotel newPH = new PacchettoHotel(PacchettoHotelDTO);
		em.persist(newPH);
		
		pacchettoMezzoADTO.setIDPacchetto(newP.getId());
		PacchettoMezzo newPMA = new PacchettoMezzo(pacchettoMezzoADTO);
		em.persist(newPMA);
		
		pacchettoMezzoRDTO.setIDPacchetto(newP.getId());
		PacchettoMezzo newPMR = new PacchettoMezzo(pacchettoMezzoRDTO);
		em.persist(newPMR);
		
		for (int i=0; i<PacchettoEscursioneDTO.size(); i++)
		{
			PacchettoEscursioneDTO app =PacchettoEscursioneDTO.get(i);
			app.setIDPacchetto(newP.getId());
			PacchettoEscursione newPE = new PacchettoEscursione(app);
			em.persist(newPE);
		}
		//PacchettoEscursioneDTO.setIDPacchetto(newP.getId());
		//PacchettoEscursione newPE = new PacchettoEscursione(PacchettoEscursioneDTO);
		//em.persist(newPE);
		
		return newP.getId();
		
	}
	

	private BigDecimal sommaPrezzi(String nomeHotel, int idAndata, int idRitorno, ArrayList<EscursioneDTO> nomeEscursione, Date dataPartenza, Date dataRitorno){
		Query qH= em.createNamedQuery("Hotel.findPrezzo").setParameter("nomeH", nomeHotel);
		Query qA= em.createNamedQuery("Mezzo.findPrezzo").setParameter("idMezzo", idAndata);
		Query qR= em.createNamedQuery("Mezzo.findPrezzo").setParameter("idMezzo", idRitorno);
		//Query qE= em.createNamedQuery("Escursione.findPrezzo").setParameter("nomeEsc", nomeEscursione);
		BigDecimal prezzoHotel =(BigDecimal) qH.getSingleResult();
		BigDecimal prezzoAndata =(BigDecimal) qA.getSingleResult();
		BigDecimal prezzoRitorno =(BigDecimal) qR.getSingleResult();
		BigDecimal prezzoEscursione = new BigDecimal(0);
		for (int i=0; i<nomeEscursione.size(); i++){
			prezzoEscursione = prezzoEscursione.add(nomeEscursione.get(i).getPrezzo());
		}
		BigDecimal totale = new BigDecimal(0);
		
		long millisDiff = dataRitorno.getTime() - dataPartenza.getTime();
		int days = (int) (millisDiff / 86400000);
		BigDecimal giorniViaggio = new BigDecimal (days);
				
		totale = totale.add(prezzoAndata.add(prezzoEscursione.add(prezzoRitorno.add(prezzoHotel.multiply(giorniViaggio)))));
		return totale;
	}
	
	public ArrayList<CittaDTO> CittaList()
	{
		Query q= em.createNamedQuery("Citta.findAll");
		List<Citta> cittaList =  (List<Citta>) q.getResultList();
		ArrayList<CittaDTO> cittaListDTO = new ArrayList<CittaDTO>();

		for (int i=0; i<cittaList.size(); i++)
		{
			CittaDTO app = new CittaDTO();
			app.setCitta(cittaList.get(i).getCitta());
			cittaListDTO.add(app);
		}
		
		return cittaListDTO;
	}

	
	
	@Override
	public ArrayList<PacchettoPredefinitoDTO> AllP() {
		
		Query q= em.createNamedQuery("Pacchetto.findAll");
		List<Pacchetto>PacchettoList =(List<Pacchetto>) q.getResultList();
		ArrayList<PacchettoPredefinitoDTO> PacchettoListDTO = new ArrayList<PacchettoPredefinitoDTO>();
		for (int i=0; i<PacchettoList.size(); i++)
		{
			PacchettoPredefinitoDTO app = new PacchettoPredefinitoDTO();
			app.setTipo("ID:"+PacchettoList.get(i).getId()+";   Nome:"+PacchettoList.get(i).getNome() +";   Tipo:"+PacchettoList.get(i).getTipo());
			int appi = PacchettoList.get(i).getId();
			String apps = String.valueOf(appi);
			app.setNome(apps);
			
			PacchettoListDTO.add(app);
		}
		
		
		return PacchettoListDTO;
	}

	@Override
	public void canc(ArrayList<String> PacchettiC) {
		
		for (int i=0; i< PacchettiC.size(); i++)
		{
			Query query = em.createQuery ("UPDATE Pacchetto p SET p.Disponibile = FALSE WHERE p.id = '"+ PacchettiC.get(i)+"'");
			int updateCount = query.executeUpdate();
		}
		
	}

	@Override
	public ArrayList<PacchettoPredefinitoDTO> ListaPacchetti() {
		Query q= em.createNamedQuery("Pacchetto.findAll");
		List<Pacchetto>PacchettoList =(List<Pacchetto>) q.getResultList();
		ArrayList<PacchettoPredefinitoDTO> PacchettoListDTO = new ArrayList<PacchettoPredefinitoDTO>();
		for (int i=0; i<PacchettoList.size(); i++)
		{
			PacchettoPredefinitoDTO app = new PacchettoPredefinitoDTO();
			app.setData_Partenza(PacchettoList.get(i).getData_Partenza());
			app.setData_Ritorno(PacchettoList.get(i).getData_Ritorno());
			app.setDisponibile(PacchettoList.get(i).getDisponibile());
			app.setId(PacchettoList.get(i).getId());
			app.setNome(PacchettoList.get(i).getNome());
			app.setPrezzo(PacchettoList.get(i).getPrezzo());
			app.setTipo(PacchettoList.get(i).getTipo());
			app.setEmail(PacchettoList.get(i).getEmail());
			
			Query c= em.createNamedQuery("PacchettoCitta.findCitta").setParameter("idPacchetto", PacchettoList.get(i).getId());
			String city = (String)c.getSingleResult();
			app.setCitta(city);
			PacchettoListDTO.add(app);
		}
		return PacchettoListDTO;
	}

	@Override
	public String findHotel(int idPacchetto) {
		Query q= em.createNamedQuery("PacchettoHotel.findHotel").setParameter("idPacchetto", idPacchetto);
		return (String) q.getSingleResult();
	}

	@Override
	public String findCitta(int idPacchetto) {
		Query q= em.createNamedQuery("PacchettoCitta.findCitta").setParameter("idPacchetto", idPacchetto);
		return (String) q.getSingleResult();
	}

	@Override
	public ArrayList <EscursioneDTO> findEscursione(int idPacchetto) {
		Query q= em.createNamedQuery("PacchettoEscursione.findEscursione").setParameter("idPacchetto", idPacchetto);
		List<String> nomeEscursioneLista = (List<String>) q.getResultList();
		ArrayList <EscursioneDTO> escList = new ArrayList<EscursioneDTO>();
		ArrayList<Escursione> EscursioneList = new ArrayList<Escursione>();
		for (int i=0; i<nomeEscursioneLista.size(); i++){
			EscursioneList.add((Escursione) em.createNamedQuery("Escursione.findThis").setParameter("nomeEsc", nomeEscursioneLista.get(i)).getSingleResult());
			EscursioneDTO app = new EscursioneDTO();
			app.setNome(EscursioneList.get(i).getNomeEscursione());
			app.setCittaE(EscursioneList.get(i).getCittaEscursione());
			app.setCittaP(EscursioneList.get(i).getCittaPartenza());
			app.setMezzo(EscursioneList.get(i).getMezzo_utilizzato());
			app.setPrezzo(EscursioneList.get(i).getPrezzo());
			app.setDisponibile(EscursioneList.get(i).getDisponibile());
			escList.add(app);
		}
		return escList;
	}

	@Override
	public int findMezzoAndata(int idPacchetto, String cittaPacchetto) {
		Query q= em.createNamedQuery("PacchettoMezzo.findMezzo").setParameter("idPacchetto", idPacchetto);
		Query q2;
		List<PacchettoMezzo> ListaPacchettoMezzoDTO = (List<PacchettoMezzo>) q.getResultList();
		ArrayList<MezzoDiTrasporto> ListaMezzoDTO = new ArrayList<MezzoDiTrasporto>();
		
		for(int i=0; i<ListaPacchettoMezzoDTO.size(); i++){
			q2=em.createNamedQuery("Mezzo.findMezzoById").setParameter("idMezzo", ListaPacchettoMezzoDTO.get(i).getMezzo());
			ListaMezzoDTO.addAll((ArrayList<MezzoDiTrasporto>)q2.getResultList());
		}
		
		for(int j=0; j<ListaMezzoDTO.size();j++){
			if(ListaMezzoDTO.get(j).getLuogoarrivo().equals(cittaPacchetto)) return ListaMezzoDTO.get(j).getMezzo();
		}
		return 0;
		
	}

	@Override
	public int findMezzoRitorno(int idPacchetto, String cittaPacchetto) {
		Query q= em.createNamedQuery("PacchettoMezzo.findMezzo").setParameter("idPacchetto", idPacchetto);
		Query q2;
		List<PacchettoMezzo> ListaPacchettoMezzoDTO = (List<PacchettoMezzo>) q.getResultList();
		ArrayList<MezzoDiTrasporto> ListaMezzoDTO = new ArrayList<MezzoDiTrasporto>();
		
		for(int i=0; i<ListaPacchettoMezzoDTO.size(); i++){
			q2=em.createNamedQuery("Mezzo.findMezzoById").setParameter("idMezzo", ListaPacchettoMezzoDTO.get(i).getMezzo());
			ListaMezzoDTO.addAll((ArrayList<MezzoDiTrasporto>)q2.getResultList());
		}
		
		for(int j=0; j<ListaMezzoDTO.size();j++){
			if(ListaMezzoDTO.get(j).getLuogopartenza().equals(cittaPacchetto)) return ListaMezzoDTO.get(j).getMezzo();
		}
		return 0;
	}

	@Override
	public Date findDataRitorno(int idPacchetto) {
		
		Query q= em.createNamedQuery("Pacchetto.findDataRitorno").setParameter("idPacchetto", idPacchetto);
		return (Date) q.getSingleResult();
		
	}

	@Override
	public Date findDataPartenza(int idPacchetto) {
		Query q= em.createNamedQuery("Pacchetto.findDataPartenza").setParameter("idPacchetto", idPacchetto);
		return (Date) q.getSingleResult();
	}

	@Override
	public void applicaModificaPacchetto(int idPacchetto, Date dataPartenza, Date dataRitorno, ArrayList<EscursioneDTO> listaEscursionePacchetto, String nomeHotelPacchetto, int idMezzoAndataPacchetto, int idMezzoRitornoPacchetto, int vecchioMezzoAndata, int vecchioMezzoRitorno) {
		
		List<String> vecchiaEscursione;
		String vecchioHotel;
		String nomeEscursione;
		
		Timestamp oraPartenza = new Timestamp(0);
		Timestamp oraRitorno = new Timestamp(0);
		
		oraRitorno.setDate(dataRitorno.getDate());
		oraRitorno.setMonth(dataRitorno.getMonth());
		oraRitorno.setYear(dataRitorno.getYear());
		oraRitorno.setHours(dataRitorno.getHours());
		oraRitorno.setMinutes(dataRitorno.getMinutes());
		oraRitorno.setSeconds(00);
		
		oraPartenza.setDate(dataPartenza.getDate());
		oraPartenza.setMonth(dataPartenza.getMonth());
		oraPartenza.setYear(dataPartenza.getYear());
		oraPartenza.setHours(dataPartenza.getHours());
		oraPartenza.setMinutes(dataPartenza.getMinutes());
		oraPartenza.setSeconds(00);
		
		
		Query oldEsc = em.createNamedQuery("PacchettoEscursione.findEscursione").setParameter("idPacchetto", idPacchetto);
		Query oldHot = em.createNamedQuery("PacchettoHotel.findHotel").setParameter("idPacchetto", idPacchetto);
		
		vecchiaEscursione=(List<String>)oldEsc.getResultList();
		vecchioHotel=(String)oldHot.getSingleResult();
		
		if(dataPartenza!=null) em.createQuery("UPDATE Pacchetto p SET p.data_Partenza ='"+ oraPartenza +"' WHERE p.id ='"+ idPacchetto+"'").executeUpdate();

		if(dataRitorno!=null)em.createQuery("UPDATE Pacchetto p SET p.data_Ritorno ='"+ oraRitorno +"' WHERE p.id ='"+ idPacchetto+"'").executeUpdate();
		
		
			//ciclo per eliminare tutte le escursioni vecchie

		for(int j=0; j < vecchiaEscursione.size(); j++){
			nomeEscursione=vecchiaEscursione.get(j);
			Query trovaChiave = em.createNamedQuery("PacchettoEscursione.findRiga").setParameter("nomeEscursione", nomeEscursione).setParameter("idP", idPacchetto);
			PacchettoEscursione chiave = (PacchettoEscursione) trovaChiave.getSingleResult();
			PacchettoEscursione daRimuovere = em.find(PacchettoEscursione.class, chiave.getNumriga());
			em.remove(daRimuovere);
		}
			
			//ciclo per inserire tutte le escursioni
//		while (!(listaEscursionePacchetto.isEmpty())) em.persist(listaEscursionePacchetto.remove(0));
		for (int i=0; i < listaEscursionePacchetto.size(); i++){
			PacchettoEscursione daInserire = new PacchettoEscursione();
			daInserire.setIDPacchetto(idPacchetto);
			daInserire.setNomeEscursione(listaEscursionePacchetto.get(i).getNomeEscursione());
			em.persist(daInserire);
		}

		
		if(!(nomeHotelPacchetto.equals(vecchioHotel))) em.createQuery("UPDATE PacchettoHotel ph SET ph.nomeHotel='"+ nomeHotelPacchetto+"' WHERE ph.IDPacchetto ='"+ idPacchetto+"'").executeUpdate();
		
		if(idMezzoAndataPacchetto!=vecchioMezzoAndata) em.createQuery("UPDATE PacchettoMezzo pm SET pm.mezzo='"+idMezzoAndataPacchetto+"' WHERE pm.id='"+idPacchetto+"' AND pm.mezzo='"+vecchioMezzoAndata+"'").executeUpdate();
		
		if(idMezzoRitornoPacchetto!=vecchioMezzoRitorno) em.createQuery("UPDATE PacchettoMezzo pm SET pm.mezzo='"+idMezzoRitornoPacchetto+"' WHERE pm.id='"+idPacchetto+"' AND pm.mezzo='"+vecchioMezzoRitorno+"'").executeUpdate();
		
		//aggiungi update prezzo
		BigDecimal nuovoPrezzo = this.sommaPrezzi(nomeHotelPacchetto,idMezzoAndataPacchetto, idMezzoRitornoPacchetto, listaEscursionePacchetto, dataPartenza, dataRitorno);
		
		em.createQuery("UPDATE Pacchetto p SET p.prezzo='"+nuovoPrezzo+"' WHERE p.id='"+ idPacchetto+"'").executeUpdate();
				
	}

	@Override
	public void compraPacchettoPred(PacchettoPredefinitoDTO PPDTO) {
		ListaPacchettiComprati PC = new ListaPacchettiComprati (PPDTO);
		em.persist(PC);
		
	}

	@Override
	public void putInGiftList(PacchettoPredefinitoDTO PPDTO) {
		GiftList appGL = new GiftList(PPDTO);
		appGL.setPagatoEscursione(false);
		appGL.setPagatoHotel(false);
		appGL.setPagatoMezzo(false);
		appGL.setPagatoPacchetto(false);
		em.persist(appGL);
	}
	
	@Override
	public int compraPersonalizzato(PacchettoPredefinitoDTO pacchettoPersonalizzato, Pacchetto_cittaDTO pCitta, ArrayList<PacchettoEscursioneDTO> lEscursione, PacchettoHotelDTO pHotel, PacchettoMezzoDTO pMezzoAndata, PacchettoMezzoDTO pMezzoRitorno, int numeroPersone) {
		int idPacchetto=add(pacchettoPersonalizzato, pCitta, pHotel, pMezzoAndata, pMezzoRitorno, lEscursione);
		return idPacchetto;
	}

	@Override
	public ArrayList<PacchettoPredefinitoDTO> selectSpecificP(String Username) {
		Query q = em.createNamedQuery("Pacchetto.findthisP").setParameter("email", Username);
		List<Pacchetto>PacchettoList =(List<Pacchetto>) q.getResultList();
		
		q=em.createNamedQuery("Pacchetto.findthisL").setParameter("email", Username);
		List<ListaPacchettiComprati>PCLIST = (List<ListaPacchettiComprati>) q.getResultList();
		
		
		ArrayList<PacchettoPredefinitoDTO> PacchettoListDTO = new ArrayList<PacchettoPredefinitoDTO>();
		for (int i=0; i<PacchettoList.size(); i++)
		{
			PacchettoPredefinitoDTO app = new PacchettoPredefinitoDTO();
			app.setData_Partenza(PacchettoList.get(i).getData_Partenza());
			app.setData_Ritorno(PacchettoList.get(i).getData_Ritorno());
			app.setDisponibile(PacchettoList.get(i).getDisponibile());
			app.setId(PacchettoList.get(i).getId());
			app.setNome(PacchettoList.get(i).getNome());
			app.setPrezzo(PacchettoList.get(i).getPrezzo());
			app.setTipo(PacchettoList.get(i).getTipo());
			app.setEmail(PacchettoList.get(i).getEmail());
			Query c= em.createNamedQuery("PacchettoCitta.findCitta").setParameter("idPacchetto", PacchettoList.get(i).getId());;
			String city = (String)c.getSingleResult();
			app.setCitta(city);
			app.setNumRiga(PCLIST.get(i).getNum());		
			app.setNumPren(PCLIST.get(i).getNumeroPersone());
			PacchettoListDTO.add(app);
			
			
		}
		return PacchettoListDTO;
	}

	@Override
	public ArrayList<PacchettoPredefinitoDTO> selectSpecificGL(String username) {
		Query q = em.createNamedQuery("Pacchetto.findthisPGL").setParameter("email", username);
		List<Pacchetto>PacchettoList =(List<Pacchetto>) q.getResultList();
		
		q=em.createNamedQuery("Pacchetto.findthisLGL").setParameter("email", username);
		List<GiftList>PCLIST = (List<GiftList>) q.getResultList();
		
		
		ArrayList<PacchettoPredefinitoDTO> PacchettoListDTO = new ArrayList<PacchettoPredefinitoDTO>();
		for (int i=0; i<PacchettoList.size(); i++)
		{
			PacchettoPredefinitoDTO app = new PacchettoPredefinitoDTO();
			app.setData_Partenza(PacchettoList.get(i).getData_Partenza());
			app.setData_Ritorno(PacchettoList.get(i).getData_Ritorno());
			app.setDisponibile(PacchettoList.get(i).getDisponibile());
			app.setId(PacchettoList.get(i).getId());
			app.setNome(PacchettoList.get(i).getNome());
			app.setPrezzo(PacchettoList.get(i).getPrezzo());
			app.setTipo(PacchettoList.get(i).getTipo());
			app.setEmail(PacchettoList.get(i).getEmail());
			app.setNumPren(PCLIST.get(i).getNumeroPersone());
			System.out.println(app.getNumPren());
			Query c= em.createNamedQuery("PacchettoCitta.findCitta").setParameter("idPacchetto", PacchettoList.get(i).getId());;
			String city = (String)c.getSingleResult();
			app.setCitta(city);
			app.setNumRiga(PCLIST.get(i).getNum());
			app.setPagatoEscursione(PCLIST.get(i).getPagatoEscursione());
			app.setPagatoHotel(PCLIST.get(i).getPagatoHotel());
			app.setPagatoMezzo(PCLIST.get(i).getPagatoMezzo());
			app.setPagatoPacchetto(PCLIST.get(i).getPagatoPacchetto());
			
			PacchettoListDTO.add(app);
			System.out.println (app.getId());
			
		}
		return PacchettoListDTO;
	
	}

	@Override
	public PacchettoPredefinitoDTO findGiftList(int codiceGiftList) {
		Query pacchettoInGiftList = em.createNamedQuery("GiftList.findPacchettoById").setParameter("numRiga", codiceGiftList);
		if (!pacchettoInGiftList.getResultList().isEmpty()){
			ArrayList <GiftList> listaRisultati = (ArrayList<GiftList>) pacchettoInGiftList.getResultList();
			Query pacchettoInPacchetto = em.createNamedQuery("Pacchetto.findPacchettoById").setParameter("idPacchetto", listaRisultati.get(0).getPacchetto());
			Pacchetto appPack = (Pacchetto) pacchettoInPacchetto.getSingleResult();
			PacchettoPredefinitoDTO packRisultato = new PacchettoPredefinitoDTO();
			packRisultato.setData_Partenza(appPack.getData_Partenza());
			packRisultato.setData_Ritorno(appPack.getData_Ritorno());
			packRisultato.setDisponibile(appPack.getDisponibile());
			packRisultato.setEmail(listaRisultati.get(0).getEmail());
			packRisultato.setNumPren(listaRisultati.get(0).getNumeroPersone());
			packRisultato.setId(appPack.getId());
			packRisultato.setNome(appPack.getNome());
			packRisultato.setPrezzo(appPack.getPrezzo());
			packRisultato.setTipo(appPack.getTipo());
			packRisultato.setNumRiga(codiceGiftList);
			packRisultato.setPagatoEscursione(listaRisultati.get(0).getPagatoEscursione());
			packRisultato.setPagatoHotel(listaRisultati.get(0).getPagatoHotel());
			packRisultato.setPagatoMezzo(listaRisultati.get(0).getPagatoMezzo());
			packRisultato.setPagatoPacchetto(listaRisultati.get(0).getPagatoPacchetto());
			Query cittaPacchetto = em.createNamedQuery("PacchettoCitta.findCitta").setParameter("idPacchetto", packRisultato.getId());
			packRisultato.setCitta((String) cittaPacchetto.getSingleResult());
			return packRisultato;
		}else{
			PacchettoPredefinitoDTO appPackMerda = new PacchettoPredefinitoDTO();
			appPackMerda.setId(0);
			return appPackMerda;
		}
		
	}

	@Override
	public PacchettoPredefinitoDTO setPrezziDTO( PacchettoPredefinitoDTO pacchettoSenzaPrezzi) {
		BigDecimal prezzoEscursione;
		BigDecimal prezzoHotel;
		BigDecimal prezzoMezzo;
		
		Hotel entityHotel;
		ArrayList<MezzoDiTrasporto> listaMezzi = new ArrayList<MezzoDiTrasporto>();
		ArrayList<Escursione> listaEscursioni = new ArrayList<Escursione>();
		
		Query nomeH = em.createNamedQuery("PacchettoHotel.findEntityHotel").setParameter("idPacchetto", pacchettoSenzaPrezzi.getId());
		entityHotel = (Hotel) nomeH.getSingleResult();
		
		Query nomeM = em.createNamedQuery("PacchettoMezzo.findEntityMezzo").setParameter("idPacchetto", pacchettoSenzaPrezzi.getId());
		listaMezzi.addAll((List<MezzoDiTrasporto>) nomeM.getResultList());
		
		Query nomeE = em.createNamedQuery("PacchettoEscursione.findEntityEscursione").setParameter("idPacchetto", pacchettoSenzaPrezzi.getId());
		listaEscursioni.addAll((List<Escursione>) nomeE.getResultList());
		
		
		Query qH= em.createNamedQuery("Hotel.findPrezzo").setParameter("nomeH", entityHotel.getNomeHotel());
		Query qA= em.createNamedQuery("Mezzo.findPrezzo").setParameter("idMezzo", listaMezzi.get(0).getMezzo());
		Query qR= em.createNamedQuery("Mezzo.findPrezzo").setParameter("idMezzo", listaMezzi.get(1).getMezzo());
		Query qE= em.createNamedQuery("Escursione.findPrezzo");
		
		prezzoHotel = (BigDecimal) qH.getSingleResult();
		
		//conversione data in giorni
		long millisDiff = pacchettoSenzaPrezzi.getData_Ritorno().getTime() - pacchettoSenzaPrezzi.getData_Partenza().getTime();
		int days = (int) (millisDiff / 86400000);
		
		//int durataViaggio = pacchettoSenzaPrezzi.getData_Ritorno().compareTo(pacchettoSenzaPrezzi.getData_Partenza());
		BigDecimal giorniViaggio = new BigDecimal (days);
		System.out.println(days);
		
		BigDecimal NP = new BigDecimal(pacchettoSenzaPrezzi.getNumPren());
		
				
		prezzoHotel = prezzoHotel.multiply(giorniViaggio);
		prezzoHotel = prezzoHotel.multiply(NP);
		prezzoMezzo = (BigDecimal) qA.getSingleResult();
		prezzoMezzo = prezzoMezzo.add((BigDecimal) qR.getSingleResult());
		prezzoMezzo = prezzoMezzo.multiply(NP);
		prezzoEscursione = new BigDecimal(0);
		
		for(int i=0; i<listaEscursioni.size(); i++){
			BigDecimal appBD = (BigDecimal) qE.setParameter("nomeEsc", listaEscursioni.get(i).getNomeEscursione()).getSingleResult();
			prezzoEscursione = prezzoEscursione.add(appBD);
		}
		prezzoEscursione = prezzoEscursione.multiply(NP);
		System.out.println(prezzoEscursione);
		pacchettoSenzaPrezzi.setPrezzoEscursione(prezzoEscursione);
		pacchettoSenzaPrezzi.setPrezzoHotel(prezzoHotel);
		pacchettoSenzaPrezzi.setPrezzoMezzo(prezzoMezzo);
		pacchettoSenzaPrezzi.setPrezzo(prezzoMezzo.add(prezzoHotel.add(prezzoEscursione)));
		return pacchettoSenzaPrezzi;
	}

	@Override
	public void pagaParti(PacchettoPredefinitoDTO paga) {
		if (paga.getPagatoPacchetto())
		{
			GiftList appGL;
//			GiftList appGL = new GiftList();
//			appGL.setNum(paga.getNumRiga());
//			appGL.setEmail(paga.getEmail());
//			appGL.setPacchetto(paga.getId());
			Query Q = em.createNamedQuery("GiftList.findPacchettoById").setParameter("numRiga", paga.getNumRiga());
			appGL = (GiftList) Q.getSingleResult();
			em.remove(appGL);
			
			ListaPacchettiComprati LPC = new ListaPacchettiComprati();
			LPC.setNum(paga.getNumRiga());
			LPC.setEmail(paga.getEmail());
			LPC.setPacchetto(paga.getId());
			LPC.setNumeroPersone(paga.getNumPren());
			em.persist(LPC);
		}
		else if (paga.getPagatoEscursione() && paga.getPagatoHotel() && paga.getPagatoMezzo())
		{
			GiftList appGL;
//			GiftList appGL = new GiftList();
//			appGL.setNum(paga.getNumRiga());
//			appGL.setEmail(paga.getEmail());
//			appGL.setPacchetto(paga.getId());
			Query Q = em.createNamedQuery("GiftList.findPacchettoById").setParameter("numRiga", paga.getNumRiga());
			appGL = (GiftList) Q.getSingleResult();
			em.remove(appGL);
			
			ListaPacchettiComprati LPC = new ListaPacchettiComprati();
			LPC.setNum(paga.getNumRiga());
			LPC.setEmail(paga.getEmail());
			LPC.setPacchetto(paga.getId());
			LPC.setNumeroPersone(paga.getNumPren());
			em.persist(LPC);
		}
		else
		{
			em.createQuery("UPDATE GiftList gl SET gl.pagatoEscursione='"+ paga.getPagatoEscursione()+"' "
					+ "WHERE gl.num ='"+ paga.getNumRiga()+"'").executeUpdate();
			em.createQuery("UPDATE GiftList gl SET gl.pagatoHotel='"+ paga.getPagatoHotel()+"' "
					+ "WHERE gl.num ='"+ paga.getNumRiga()+"'").executeUpdate();
			em.createQuery("UPDATE GiftList gl SET gl.pagatoMezzo='"+ paga.getPagatoMezzo()+"' "
					+ "WHERE gl.num ='"+ paga.getNumRiga()+"'").executeUpdate();
		}
		
	}

	@Override
	public HotelDTO findEntityHotel(int idPacchetto) {
		Query findHotel = em.createNamedQuery("PacchettoHotel.findEntityHotel").setParameter("idPacchetto", idPacchetto);
		Hotel entityHotel = (Hotel) findHotel.getSingleResult();
		HotelDTO dtoHotel = new HotelDTO();
		dtoHotel.setCitta(entityHotel.getCitta());
		dtoHotel.setDisponibile(entityHotel.getDisponibile());
		dtoHotel.setIndirizzo(entityHotel.getIndirizzo());
		dtoHotel.setNome(entityHotel.getNomeHotel());
		dtoHotel.setPrezzo(entityHotel.getPrezzo());
		dtoHotel.setStelle(entityHotel.getStelle());
		return dtoHotel;
	}

	@Override
	public MezzoDTO findEntityMezzoAndata(PacchettoPredefinitoDTO Pacchetto) {
		Query findMezzo = em.createNamedQuery("PacchettoMezzo.findEntityMezzoByArrivo").setParameter("idPacchetto", Pacchetto.getId()).setParameter("cittaPartenza", Pacchetto.getCitta());
		MezzoDiTrasporto entityMezzo = (MezzoDiTrasporto) findMezzo.getSingleResult();
		MezzoDTO dtoMezzo = new MezzoDTO();
		dtoMezzo.setDisponibile(entityMezzo.getDisponibile());
		dtoMezzo.setIdMezzo(entityMezzo.getMezzo());
		dtoMezzo.setLuogoArrivo(entityMezzo.getLuogoarrivo());
		dtoMezzo.setLuogoPartenza(entityMezzo.getLuogopartenza());
		dtoMezzo.setTipo(entityMezzo.getTipo());
		dtoMezzo.setOraArrivo(entityMezzo.getOraarrivo());
		dtoMezzo.setOraPartenza(entityMezzo.getOrapartenza());
		dtoMezzo.setPrezzo(entityMezzo.getPrezzo());
		return dtoMezzo;
	}

	@Override
	public MezzoDTO findEntityMezzoRitorno(PacchettoPredefinitoDTO Pacchetto) {
		Query findMezzo = em.createNamedQuery("PacchettoMezzo.findEntityMezzoByCitta").setParameter("idPacchetto", Pacchetto.getId()).setParameter("cittaPartenza", Pacchetto.getCitta());
		MezzoDiTrasporto entityMezzo = (MezzoDiTrasporto) findMezzo.getSingleResult();
		MezzoDTO dtoMezzo = new MezzoDTO();
		dtoMezzo.setDisponibile(entityMezzo.getDisponibile());
		dtoMezzo.setIdMezzo(entityMezzo.getMezzo());
		dtoMezzo.setLuogoArrivo(entityMezzo.getLuogoarrivo());
		dtoMezzo.setLuogoPartenza(entityMezzo.getLuogopartenza());
		dtoMezzo.setTipo(entityMezzo.getTipo());
		dtoMezzo.setOraArrivo(entityMezzo.getOraarrivo());
		dtoMezzo.setOraPartenza(entityMezzo.getOrapartenza());
		dtoMezzo.setPrezzo(entityMezzo.getPrezzo());
		return dtoMezzo;
	}

	@Override
	public ArrayList<EscursioneDTO> findEntityEscursione(int idPacchetto) {
		ArrayList<Escursione> listaEscursioni = new ArrayList<Escursione>();
		Query findEscursione = em.createNamedQuery("PacchettoEscursione.findEntityEscursione").setParameter("idPacchetto", idPacchetto);
		listaEscursioni.addAll((List<Escursione>) findEscursione.getResultList());
		ArrayList<EscursioneDTO> dtoEscursioni= new ArrayList<EscursioneDTO>();
		for(int i=0; i<listaEscursioni.size();i++){
			EscursioneDTO dtoEscursione = new EscursioneDTO();
			dtoEscursione.setCittaE(listaEscursioni.get(i).getCittaEscursione());
			dtoEscursione.setCittaP(listaEscursioni.get(i).getCittaPartenza());
			dtoEscursione.setDisponibile(listaEscursioni.get(i).getDisponibile());
			dtoEscursione.setMezzo(listaEscursioni.get(i).getMezzo_utilizzato());
			dtoEscursione.setNome(listaEscursioni.get(i).getNomeEscursione());
			dtoEscursione.setPrezzo(listaEscursioni.get(i).getPrezzo());
			dtoEscursioni.add(dtoEscursione);
		}
		
		return dtoEscursioni;
	}
	
	
}


